package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.ClazzMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Clazz;
import com.itheima.pojo.Emp;
import com.itheima.pojo.PageResult;
import com.itheima.service.ClazzService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {
    @Autowired
    private ClazzMapper clazzMapper;
    @Autowired
    private EmpMapper empMapper;

    //分页查询
    @Override
    public PageResult<Clazz> pagelist(String name, LocalDate begin, LocalDate end, int page, int pageSize) {
        //1. 使用Mybatis-Plus进行分页，首先需要创建配置类，在配置类中配置分页插件
        //2. 先前已经配置过，这里直接新建Page对象,设置pageList对象的分页参数
        Page<Clazz> pageList = new Page<>(page,pageSize);
        //3.添加排序规则 默认排序规则是升序
        pageList.addOrder(OrderItem.desc("update_time"));
        //4. 定义条件构建器，设置模糊查询条件
        LambdaQueryWrapper<Clazz> lqw = new LambdaQueryWrapper<>();
        lqw.like(name!=null&&name.length()>0,Clazz::getName,name)
                .between(begin!=null&&end!=null,Clazz::getEndDate,begin,end);
        //执行分页查询的方法
        pageList = this.page(pageList, lqw);
        //在返回之前，需要对pageList中查到的数据进行处理：1.设置班主任姓名 2.设置班级状态
        List<Clazz> records = pageList.getRecords();
        //使用stream收集到所有的班主任id
        Set<Integer> MasterSet = records.stream().map(Clazz::getMasterId).collect(Collectors.toSet());
        if(MasterSet.size()>0){//有班主任数据需要处理
            //根据id查询员工信息
            List<Emp> empList = empMapper.selectBatchIds(MasterSet);
            //使用stream将员工信息封装到Map中，方便根据id查询员工信息
            Map<Integer, String> Map = empList.stream().collect(Collectors.toMap(Emp::getId, Emp::getName));
            //遍历records，设置班主任姓名,姓名从Map集合中获取
            //还要设置当前班级的状态，如果当前系统时间，在开始时间之前为未开班，在开始时间之后，在结束时间之前为进行中，在结束时间之后为已结课
            for (Clazz clazz : records){
                clazz.setMasterName(Map.get(clazz.getMasterId()));
                if(clazz.getBeginDate().isAfter(LocalDate.now())){
                    clazz.setStatus("未开班");
                }else if(clazz.getBeginDate().isBefore(LocalDate.now())&&clazz.getEndDate().isAfter(LocalDate.now())){
                    clazz.setStatus("进行中");
                }else{
                    clazz.setStatus("已结课");
                }
            }
        }

        return new PageResult<Clazz>(pageList.getTotal(),records);
    }

    //这里根据id查询班级信息，需要根据clazz中的班主任id去查询，员工表中的班主任姓名
    @Override
    public Clazz getListById(Integer id) {
        Clazz clazz = this.getById(id);
        Emp emp = empMapper.selectById(clazz.getMasterId());
        clazz.setMasterName(emp.getName());

        return clazz;
    }
}
